package com.itheima.tlias84.controller;

import com.itheima.tlias84.entity.Student;
import com.itheima.tlias84.utils.ResultUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * DI : 从ioc容器中获取已经创建好的对象给属性赋值
 *
 *
 * 给一个类的属性（成员变量）赋值有几种方式：4种
 * 1.等于号赋值
 * 2.构造器
 * 3.set方法
 * 4.反射
 * @Autowired 一般使用在构造器赋值和set方法赋值时
 *
 *
 * 所以说springDI注入有三种方式
 * 字段（属性）DI -> @Resource
 * 构造器DI  ->@Autowired
 * set方法DI ->@Autowired
 *
 * @Resource 与 @Autowired使用：
 * 如果一个springBean类中值需要注入很少的其它Bean对象 ->优先使用@Resource
 * 如果很多的话优先使用@Autowired 可以基于lombok实现构造器注入
 *
 *
 *
 * springbean注入的问题：
 * 1.非springbean不能调用bean
 * 2.不能形成循环依赖 ->如何解决？
 */
@Slf4j
@RestController
@RequestMapping("context")
public class TestApplicationContextController {
    @Resource
    ApplicationContext context;


    @Resource(name = "zhangsan")
    Student student;

    @Resource(name = "lisi")
    com.itheima.tlias84.dto.Student lisi;

    @GetMapping("bean")
    public ResultUtil getBeam(){
        log.info("学生bean={}",student);
        Object zhangsan = context.getBean("zhangsan");
        log.info("学生bean{}",zhangsan);
        log.info("lisi={}",lisi);
        com.itheima.tlias84.dto.Student bean = context.getBean(com.itheima.tlias84.dto.Student.class);
        log.info("lisi={}",bean);
        return ResultUtil.success();
    }
}
